PROJEKT 1 EDA KRZYSZTOF KOWALSKI¶
Celem projektu jest wykonanie eksploracyjnej analizy danych (EDA) zbioru danych pochodzącego z WHO zawierającego informacje dotyczące zanieczyszczeń powietrza na różnych poziomach generalizacji.¶
Zbiór danych¶
Zbiór posiada pomiary z różnych lokalizacji na świecie podzielone na kraje i miasta.
Kolumny w zbiorze¶
Measurement Year - okres pobierania informacji o zanieczyszczeniach powietrza, rok pomiaru.
PM2.5 (μg/m3) - Stężenie pyłów PM2.5 w mikrogramach na metr sześcienny.
PM10 (μg/m3) - Stężenie pyłów PM10 w mikrogramach na metr sześcienny.
NO2 (μg/m3) - Stężenie dwutlenku azotu (NO2) w mikrogramach na metr sześcienny.
PM25 temporal coverage (%) - Pokrycie czasowe danych dotyczących pyłów PM2.5 (%).
PM10 temporal coverage (%) - Pokrycie czasowe danych dotyczących
NO2 temporal coverage (%) - Pokrycie czasowe danych dotyczących dwutlenku azotu (%).
Reference - Odwołanie do źródła danych.
Number and type of monitoring stations - Liczba i typ stacji monitorujących.
Version of the database - Wersja bazy danych.
Status - Status danych.danych dotyczących - Status danych.
1. Wczytanie zbioru danych¶
Zbiór danych został wczytany korzystając z funkcji read_excel() z bilbioteki pandas
import pandas as pd
import warnings
import matplotlib.pyplot as plt
import seaborn as sns
warnings.filterwarnings('ignore')
who_data = pd.read_excel("who_aap_2021_v9_11august2022.xlsx", sheet_name = "AAP_2022_city_v9")
who_data.head()
| WHO Region | ISO3 | WHO Country Name | City or Locality | Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | Reference | Number and type of monitoring stations | Version of the database | Status | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Eastern Mediterranean Region | AFG | Afghanistan | Kabul | 2019 | 119.77 | NaN | NaN | 18.0 | NaN | NaN | U.S. Department of State, United States Enviro... | NaN | 2022 | NaN |
| 1 | European Region | ALB | Albania | Durres | 2015 | NaN | 17.65 | 26.63 | NaN | NaN | 83.961187 | European Environment Agency (downloaded in 2021) | NaN | 2022 | NaN |
| 2 | European Region | ALB | Albania | Durres | 2016 | 14.32 | 24.56 | 24.78 | NaN | NaN | 87.932605 | European Environment Agency (downloaded in 2021) | NaN | 2022 | NaN |
| 3 | European Region | ALB | Albania | Elbasan | 2015 | NaN | NaN | 23.96 | NaN | NaN | 97.853881 | European Environment Agency (downloaded in 2021) | NaN | 2022 | NaN |
| 4 | European Region | ALB | Albania | Elbasan | 2016 | NaN | NaN | 26.26 | NaN | NaN | 96.049636 | European Environment Agency (downloaded in 2021) | NaN | 2022 | NaN |
Alternatywną funkcją, z której można skorzystać do wczytania zbioru do odpowiedniej struktury jest użycie itables. W tym celu przekonwertowana została ramka danych korzystając z funkcji show z biblioteki itables.
Skorzystanie z Itables daje możliwość interatywnego przeglądania wczytanego zbioru. Pozwala między innymi na: \
- sortoowanie po wybranej kolumnie (rosnąco lub malejąco),
- wyszukiwanie określonej wartości w zbiorze korzystając z Search
- ustawieniu ilości rekordów, które widzimy (10, 25, 50 lub 100).
#!pip install itables
from itables import show
itable = show(who_data)
itable
| WHO Region | ISO3 | WHO Country Name | City or Locality | Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | Reference | Number and type of monitoring stations | Version of the database | Status |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Loading... (need help?) |
2. Eksploracyjna analiza danych (EDA)¶
Zaczęto od sprawdzenia ilości danych w zbiorze.
who_data.shape
(32191, 15)
who_data.dtypes
WHO Region object ISO3 object WHO Country Name object City or Locality object Measurement Year int64 PM2.5 (μg/m3) float64 PM10 (μg/m3) float64 NO2 (μg/m3) float64 PM25 temporal coverage (%) float64 PM10 temporal coverage (%) float64 NO2 temporal coverage (%) float64 Reference object Number and type of monitoring stations object Version of the database int64 Status float64 dtype: object
Zbiór składa się z 15 kolumn (głownie typu object i float, są też dwie kolumny typu int) oraz 32 tysięcy rekordów.
who_data.describe()
| Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | Version of the database | Status | |
|---|---|---|---|---|---|---|---|---|---|
| count | 32191.000000 | 15048.000000 | 21109.000000 | 22200.000000 | 7275.000000 | 5381.000000 | 19890.000000 | 32191.000000 | 0.0 |
| mean | 2015.579354 | 22.920320 | 30.533252 | 20.619336 | 90.794096 | 90.583500 | 93.696804 | 2021.744214 | NaN |
| std | 2.752654 | 17.925906 | 29.312756 | 12.133388 | 14.872681 | 13.816311 | 10.451751 | 1.051897 | NaN |
| min | 2000.000000 | 0.010000 | 1.040000 | 0.000000 | 0.000000 | 2.568493 | 1.923077 | 2016.000000 | NaN |
| 25% | 2014.000000 | 10.350000 | 16.980000 | 12.000000 | 88.595890 | 87.945205 | 93.207763 | 2022.000000 | NaN |
| 50% | 2016.000000 | 16.000000 | 22.000000 | 18.800000 | 97.000000 | 96.039000 | 96.369863 | 2022.000000 | NaN |
| 75% | 2018.000000 | 31.000000 | 31.300000 | 27.160000 | 99.000000 | 98.938000 | 98.926941 | 2022.000000 | NaN |
| max | 2021.000000 | 191.900000 | 540.000000 | 210.680000 | 100.000000 | 100.000000 | 100.000000 | 2022.000000 | NaN |
for col in who_data.columns:
print(f'W kolumnie \033[1m{col}\033[0m znajduje się \033[1m{sum(who_data[col].isnull())}\033[0m brakujących wartości co stanowi \033[1m{round(100 * sum(who_data[col].isnull()) / len(who_data[col]), 3)}\033[0m%')
W kolumnie WHO Region znajduje się 1 brakujących wartości co stanowi 0.003% W kolumnie ISO3 znajduje się 0 brakujących wartości co stanowi 0.0% W kolumnie WHO Country Name znajduje się 0 brakujących wartości co stanowi 0.0% W kolumnie City or Locality znajduje się 0 brakujących wartości co stanowi 0.0% W kolumnie Measurement Year znajduje się 0 brakujących wartości co stanowi 0.0% W kolumnie PM2.5 (μg/m3) znajduje się 17143 brakujących wartości co stanowi 53.254% W kolumnie PM10 (μg/m3) znajduje się 11082 brakujących wartości co stanowi 34.426% W kolumnie NO2 (μg/m3) znajduje się 9991 brakujących wartości co stanowi 31.037% W kolumnie PM25 temporal coverage (%) znajduje się 24916 brakujących wartości co stanowi 77.401% W kolumnie PM10 temporal coverage (%) znajduje się 26810 brakujących wartości co stanowi 83.284% W kolumnie NO2 temporal coverage (%) znajduje się 12301 brakujących wartości co stanowi 38.213% W kolumnie Reference znajduje się 5 brakujących wartości co stanowi 0.016% W kolumnie Number and type of monitoring stations znajduje się 23433 brakujących wartości co stanowi 72.794% W kolumnie Version of the database znajduje się 0 brakujących wartości co stanowi 0.0% W kolumnie Status znajduje się 32191 brakujących wartości co stanowi 100.0%
W zbiorze znajduje się duża ilość wartości brakujących. Kolumny, w których wartości te są znaczącą częścią wszystkich wartości to:
- PM2.5 (μg/m3): 53.25% wszystkich wartości
- PM10 (μg/m3): 34.43% wszystkich wartości
- NO2 (μg/m3): 31.04% wszystkich wartości
- PM25 temporal coverage (%): 77.4% wszystkich wartości
- PM10 temporal coverage (%): 83.28% wszystkich wartości
- NO2 temporal coverage (%): 38.21% wszystkich wartości
- Number of type of monitoring stations: 72.79% wszystkich wartości
- Status: 100% wszytkich wartości
Przyglądając się bliżej każdej z kolumn, w której występuje mala, niezerowa ilość brakujących wartości:
- WHO Region
list(who_data['WHO Region'].unique())
['Eastern Mediterranean Region', 'European Region', 'Region of the Americas', 'Western Pacific Region', 'South East Asia Region', 'African Region', nan]
who_data[who_data['WHO Region'].isna()]
| WHO Region | ISO3 | WHO Country Name | City or Locality | Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | Reference | Number and type of monitoring stations | Version of the database | Status | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 24778 | NaN | LIE | Liechtenstein | Vaduz | 2010 | NaN | 17.88 | 23.59 | NaN | 96.164 | 98.265 | European Environment Information and Observati... | NaN | 2022 | NaN |
Brakująca wartość dla kolumny związanej z regionem występuje dla Liechtenstein, który bazując na wartościach z tej kolumny pasuje do "European Region". Dlatego ręcznie podmieniono tą wartość.
who_data.loc[who_data['ISO3'] == "LIE", 'WHO Region'] = 'European Region'
- Reference
#list(who_data['Reference'].unique())
who_data[who_data['Reference'].isna()]
| WHO Region | ISO3 | WHO Country Name | City or Locality | Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | Reference | Number and type of monitoring stations | Version of the database | Status | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 28209 | Eastern Mediterranean Region | QAT | Qatar | Doha | 2017 | 44.0 | 148.0 | 29.0 | 98.0 | 96.0 | 99.0 | NaN | Roadside, residential and commercial area | 2022 | NaN |
| 28210 | Eastern Mediterranean Region | QAT | Qatar | Doha | 2018 | 44.0 | 181.0 | 47.0 | 99.0 | 97.0 | 99.0 | NaN | Roadside, residential and commercial area | 2022 | NaN |
| 28211 | Eastern Mediterranean Region | QAT | Qatar | Doha | 2019 | 41.0 | 208.0 | 42.0 | 97.0 | 97.0 | 99.0 | NaN | Roadside, residential and commercial area | 2022 | NaN |
| 28212 | Eastern Mediterranean Region | QAT | Qatar | Doha | 2020 | 33.0 | 108.0 | 28.0 | 98.0 | 98.0 | 99.0 | NaN | Roadside, residential and commercial area | 2022 | NaN |
| 28213 | Eastern Mediterranean Region | QAT | Qatar | Doha | 2021 | 38.0 | 150.0 | 30.0 | 97.0 | 96.0 | 99.0 | NaN | Roadside, residential and commercial area | 2022 | NaN |
Wszystkie 5 brakujących wartości dla tej kolumny pochodzi z Qataru, ponieważ cieżko przewidzieć wartość bazując na innych informacjach - pozostawiono te wartości NaN.
Ponieważ, kolumna Status nie wnosi nic do analizy danych (występują w niej same wartości brakujące) postanowiono ją usunąć ze zbioru.
Dodatkowo kolumna Verion of the database również nie wnosi nic do analizy. Ukazuje ona jedynie wersjie bazy danych (w postaci roku), dlatego zdecydowano również usunąc ją.
Obie kolumny są technicznymi kolumnami, ważnymi do przetrzymywania danych w bazie danych, ale nieprzydatnymi dla analizy.
who_data.drop(columns = 'Status', inplace = True)
who_data.drop(columns = 'Version of the database', inplace = True)
Zależność między zmiennymi¶
Ten etap EDA zaczęto od stworzenia macierzy korelacji. Oraz stworzenia wykresu ukazującego korelację.
correlation_matrix = who_data.corr(numeric_only = True)
correlation_matrix
| Measurement Year | PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | PM25 temporal coverage (%) | PM10 temporal coverage (%) | NO2 temporal coverage (%) | |
|---|---|---|---|---|---|---|---|
| Measurement Year | 1.000000 | 0.091205 | -0.001178 | -0.111787 | -0.010997 | -0.180056 | 0.085096 |
| PM2.5 (μg/m3) | 0.091205 | 1.000000 | 0.874187 | 0.430170 | -0.096469 | -0.208969 | -0.209094 |
| PM10 (μg/m3) | -0.001178 | 0.874187 | 1.000000 | 0.305560 | -0.319848 | -0.232562 | -0.289788 |
| NO2 (μg/m3) | -0.111787 | 0.430170 | 0.305560 | 1.000000 | -0.091963 | 0.007328 | -0.026477 |
| PM25 temporal coverage (%) | -0.010997 | -0.096469 | -0.319848 | -0.091963 | 1.000000 | 0.609317 | 0.342581 |
| PM10 temporal coverage (%) | -0.180056 | -0.208969 | -0.232562 | 0.007328 | 0.609317 | 1.000000 | 0.679646 |
| NO2 temporal coverage (%) | 0.085096 | -0.209094 | -0.289788 | -0.026477 | 0.342581 | 0.679646 | 1.000000 |
plt.figure(figsize = [15, 5])
plt.subplot(1, 3, 1)
sns.histplot(data = who_data, x = 'PM2.5 (μg/m3)', kde = True)
plt.title('PM2.5')
plt.grid()
plt.subplot(1, 3, 2)
sns.histplot(data = who_data, x = 'PM10 (μg/m3)', kde = True)
plt.title('PM10')
plt.grid()
plt.subplot(1, 3, 3)
sns.histplot(data = who_data, x = 'NO2 (μg/m3)', kde = True)
plt.title('NO2')
plt.grid()
plt.suptitle("Histogramy")
plt.tight_layout()
plt.figure(figsize = [15, 5])
plt.subplot(1, 3, 1)
sns.boxplot(data = who_data, y='PM2.5 (μg/m3)')
plt.title('PM2.5')
plt.grid()
plt.subplot(1, 3, 2)
sns.boxplot(data = who_data, y = 'PM10 (μg/m3)')
plt.title('PM10')
plt.grid()
plt.subplot(1, 3, 3)
sns.boxplot(data = who_data, y = 'NO2 (μg/m3)')
plt.title('NO2')
plt.grid()
plt.suptitle("Wykresy pudełkowe")
plt.tight_layout()
Histogramy stężeń zanieczyszczeń nie posiadają rozkładów normalnych. Dla poszczególnych zanieczyszczeń bazując na histogramach i wykresach pudełkowych:
- PM2.5 posiada największa ilość wystąpień około 1200 dla wartości stężenia około 15
- PM10 posiada podobny rozkład do PM2.5 - posiada znacznie wyższa zmierzoną wartość maksymalną
- NO2 posiada delikatnie wyższą najczęściej występująca wartość - około 20
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.title('Macierz korelacji dla danych dotyczących zanieczyszczenia powietrza')
Text(0.5, 1.0, 'Macierz korelacji dla danych dotyczących zanieczyszczenia powietrza')
Macierz korelacji ukazuje występowanie zależnosci liniowej pomiędzy zmiennymi. Wysoka zależność dodatnia występuje pomiędzy kolumnami związanymi z zanieczyszczeniami PM2.5 oraz PM10, które dodatkowo są dosyć dobrze skorelowane z kolejną kolumna związana z zanieczyszczeniami jaką jest NO2.
Pomiędzy pozostałymi kolumnami korelacja jest niewielka (zarówno dodatnia jak i ujemna).
Przyglądając się jeszcze bliżej zależności liniowej stworzono wykres typu pairplot.
plt.figure(figsize=(10, 8))
sns.pairplot(who_data, hue = 'Measurement Year')
plt.title('Wykresy zależności liniowej między zmiennymi')
Text(0.5, 1.0, 'Wykresy zależności liniowej między zmiennymi')
<Figure size 1000x800 with 0 Axes>
Powyższa figura potwierdza występowanie dodaniej zależności liniowej między zmiennymi związanymi z wielkością określonego zanieczyszczenia.
3. EDA na różnych poziomach generalizacji¶
a) Region¶
Analiza ogólnych statystyk¶
region_stats = who_data.groupby('WHO Region').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
'PM10 (μg/m3)': ['mean', 'median', 'std'],
'NO2 (μg/m3)': ['mean', 'median', 'std']})
region_stats
| PM2.5 (μg/m3) | PM10 (μg/m3) | NO2 (μg/m3) | |||||||
|---|---|---|---|---|---|---|---|---|---|
| mean | median | std | mean | median | std | mean | median | std | |
| WHO Region | |||||||||
| African Region | 27.257120 | 22.86 | 20.435911 | 51.906625 | 41.390 | 38.927441 | 23.160242 | 19.51 | 15.597572 |
| Eastern Mediterranean Region | 38.063258 | 33.00 | 19.843202 | 121.317951 | 109.800 | 76.441168 | 45.715101 | 38.05 | 29.840508 |
| European Region | 14.002193 | 12.81 | 6.315753 | 23.013879 | 20.740 | 10.934350 | 20.389040 | 18.98 | 11.319598 |
| Region of the Americas | 11.389410 | 8.00 | 8.387063 | 30.677423 | 26.085 | 18.969999 | 15.757890 | 14.00 | 10.055134 |
| South East Asia Region | 42.841212 | 36.50 | 23.432654 | 94.626582 | 84.000 | 51.400386 | 22.099986 | 19.33 | 12.845567 |
| Western Pacific Region | 40.324123 | 39.11 | 18.012102 | 32.781478 | 22.400 | 27.102957 | 31.970357 | 33.00 | 14.094483 |
Rejony w zależności od mierzonego stężenia zanieczysczenia posiadają różny rankinch najwyższych średnich stężeń zanieczyszczeń. I tak:
- dla PM2.5 najwyższą średnia posiada Południowo-Wschodnia Azja, a najniższą Ameryka
- dla PM10 najwyższą średnią posiada region Morza Śródziemnego, natomiast najniższą Europa
- dla NO2 najwyższą średnią posiada region Morza Śródziemnego, natomiast najniższą Ameryka
Liczba obserwacji w każdym z regionów¶
plt.figure(figsize = [10, 6])
region_counts = who_data['WHO Region'].value_counts()
sns.barplot(x = region_counts.index, y = region_counts.values)
plt.title('Liczba obserwacji dla poszczególnych regionów')
plt.xlabel('WHO Region')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
([0, 1, 2, 3, 4, 5], [Text(0, 0, 'European Region'), Text(1, 0, 'Western Pacific Region'), Text(2, 0, 'Region of the Americas'), Text(3, 0, 'South East Asia Region'), Text(4, 0, 'Eastern Mediterranean Region'), Text(5, 0, 'African Region')])
Regionem najczęściej badanym jest Europa z ogromną różnicą wyprzedza inne rejony z iloscią obserwacji około 20 000 (dla porównania drugi z rejonów - Zachód Pacyfiku posiada około 5 000 obserwacji). Region Afrykański jest najrzadziej badany. Niską ilościa obserwacji cechuje się również wschodni rejon Morza Śródziemnego (co może byc powodem niespodziewnanie wysokich wartości stężeń zanieczyszczeń na tym obszarze).
Wykresy rozrzutu¶
plt.figure(figsize = [15, 5])
plt.subplot(1, 3, 1)
sns.scatterplot(data = who_data, x = 'PM2.5 (μg/m3)', y = 'NO2 (μg/m3)', hue = 'WHO Region')
plt.title('PM2.5 vs NO2')
plt.grid()
plt.subplot(1, 3, 2)
sns.scatterplot(data = who_data, x = 'PM10 (μg/m3)', y = 'NO2 (μg/m3)', hue = 'WHO Region')
plt.title('PM10 vs NO2')
plt.grid()
plt.subplot(1, 3, 3)
sns.scatterplot(data = who_data, x = 'PM2.5 (μg/m3)', y = 'PM10 (μg/m3)', hue = 'WHO Region')
plt.title('PM2.5 vs PM10')
plt.grid()
plt.suptitle("Wykresy rozrzutu")
plt.tight_layout()
Każda z badanych par stężeń zanieczyszczeń prezentuje się inaczej. W przypadku porównania PM2.5 i PM10 widoczna jest najwyższa dodatnia zależność liniowa dla każdego z rejonów (gorsze zależności są dla regionu afrykańskiego i Morza Śródziemnego, ale są to rejony posiadające najmniejszą liczbę obserwacji). Dla wszystkich z par tendencja każdego z rejonów jest podobna.
Zmiana zanieczyszczeń w czasie¶
pollutants = ['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']
who_regions = who_data['WHO Region'].unique()
colors = ['blue', 'orange', 'green']
fig, axes = plt.subplots(2, 3, figsize = [15, 10])
for j, region in enumerate(who_regions):
region_data = who_data[who_data['WHO Region'] == region]
for k, pollutant in enumerate(pollutants):
pollutant_data = region_data[['Measurement Year', pollutant]].dropna()
sns.lineplot(data = pollutant_data, x = 'Measurement Year', y = pollutant, ax = axes[j // 3, j % 3], color = colors[k], label = pollutant)
axes[j // 3, j % 3].set_title(region)
axes[j // 3, j % 3].set_xlabel('Measurement Year')
axes[j // 3, j % 3].set_ylabel(pollutant)
axes[j // 3, j % 3].grid()
axes[j // 3, j % 3].set_xlim(pollutant_data['Measurement Year'].min(), pollutant_data['Measurement Year'].max())
axes[-1, -1].legend()
plt.suptitle('Zmiany stężeń zanieczyszczeń powietrza w czasie')
plt.tight_layout()
Przyglądają się zmianie stężeń zanieczyszczeń w czasie w rejonie najczęściej badanym (Europa) widoczny jest spadek stężeń w ostatnich latach. Podobna sytuacja widoczna jest dla rejonu Ameryk. Ciekawie prezentuje sięwykres dla obszaru zachodu Pacyfiku - widoczny jest drastyczny spadek cząsteczek PM2.5 przy wzroście PM10 i NO2. Dla południowo-wschodniej Azji stężenia w latach (2016-2019) ustabilizowały się na podobnym poziomie.
Macierze korelacji¶
fig, axes = plt.subplots(2, 3, figsize = [20, 15])
for i, region in enumerate(who_regions):
region_data = who_data[who_data['WHO Region'] == region]
correlation_matrix = region_data.corr(numeric_only = True)
sns.heatmap(correlation_matrix, ax = axes[i // 3, i % 3], annot = True, cmap = 'coolwarm', fmt = ".2f")
axes[i // 3, i % 3].set_title(region)
axes[i // 3, i % 3].set_xticklabels(axes[i // 3, i % 3].get_xticklabels(), rotation = 90)
plt.suptitle('Macierze korelacji dla danych dotyczących zanieczyszczenia powietrza, podzielone na regiony WHO')
plt.tight_layout()
Macierze korelacji ukazują podobną informacje do wykresów rozrzutu - dobrze skorelowane są wszystkie z mierzonych cząstek (szczególnie PM2.5 i PM10). Najwyższa korelacja widoczna jest dla Rejonu zachodu Pacyfiku (0.97 pomiedzy PM2.5 i PM10i aż 0.71 pomiędzy NO2 i PM2.5). Ciekawa obserwacją jest identyczna korelacja pomiędzy stężeniami PM2.5 i PM10 dla południowo-wschodnie Azji, Europy i Ameryk (0.84)
b) Kraje¶
Analiza ogólnych statystyk¶
country_stats = who_data.groupby('WHO Country Name').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
'PM10 (μg/m3)': ['mean', 'median', 'std'],
'NO2 (μg/m3)': ['mean', 'median', 'std']})
top_5_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nlargest(5)
top_5_pm10 = country_stats['PM10 (μg/m3)']['mean'].nlargest(5)
top_5_no2 = country_stats['NO2 (μg/m3)']['mean'].nlargest(5)
print("Top 5 kraje o najwyższych średnich stężeniach PM2.5:")
print(country_stats.loc[top_5_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najwyższych średnich stężeniach PM10:")
print(country_stats.loc[top_5_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najwyższych średnich stężeniach NO2:")
print(country_stats.loc[top_5_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5:
PM2.5 (μg/m3)
mean median std
WHO Country Name
Afghanistan 119.770000 119.77 NaN
Cameroon 82.666667 67.00 43.661577
Bangladesh 75.127000 70.52 28.373649
Mongolia 73.865833 74.50 27.980191
Tajikistan 71.520000 71.52 NaN
Top 5 kraje o najwyższych średnich stężeniach PM10:
PM10 (μg/m3)
mean median std
WHO Country Name
Pakistan 333.5425 323.000 190.140257
Egypt 227.0000 225.000 51.648814
Ghana 175.3750 177.785 16.977449
Uganda 170.4000 170.400 NaN
Mongolia 169.2200 153.050 45.885529
Top 5 kraje o najwyższych średnich stężeniach NO2:
NO2 (μg/m3)
mean median std
WHO Country Name
Iran (Islamic Republic of) 69.443902 64.970 41.378545
Iraq 53.527000 53.370 16.599366
Lebanon 53.000000 53.000 8.485281
Bahrain 51.625000 51.625 5.932626
Mongolia 46.400000 49.000 8.294577
Powyżej widoczne jest 5 krajów posiadajace najwyższe średnie stęzenia każdego z mierzonych zanieczyszczeń. Są to kraje azjatyckie oraz afrykańskie. Co, ciekawe dla każdej z cząstek istnieją różne "liderujące" kraje (wyjątkiem jest Mongolia, która pojawia się w każdym z rankingów).
less_5_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nsmallest(5)
less_5_pm10 = country_stats['PM10 (μg/m3)']['mean'].nsmallest(5)
less_5_no2 = country_stats['NO2 (μg/m3)']['mean'].nsmallest(5)
print("Top 5 kraje o najniższych średnich stężeniach PM2.5:")
print(country_stats.loc[less_5_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najniższych średnich stężeniach PM10:")
print(country_stats.loc[less_5_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najniższych średnich stężeniach NO2:")
print(country_stats.loc[less_5_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najniższych średnich stężeniach PM2.5:
PM2.5 (μg/m3)
mean median std
WHO Country Name
Bahamas 4.163333 4.060 1.018937
Iceland 5.588065 4.550 3.349053
Estonia 6.018148 5.620 1.679390
Sweden 6.165315 5.900 2.220703
Finland 6.200472 6.135 1.577751
Top 5 kraje o najniższych średnich stężeniach PM10:
PM10 (μg/m3)
mean median std
WHO Country Name
Bahamas 4.650000 4.49 1.088853
Iceland 10.614054 7.42 6.396617
Estonia 12.723000 12.79 4.051279
Finland 12.739095 12.37 3.481434
Canada 13.651172 13.00 4.420643
Top 5 kraje o najniższych średnich stężeniach NO2:
NO2 (μg/m3)
mean median std
WHO Country Name
Estonia 6.775179 5.610 4.800989
Myanmar 6.815000 6.100 2.530909
Iceland 7.896053 5.150 6.575193
Trinidad and Tobago 9.600000 8.300 3.852380
Australia 9.772121 9.055 4.413393
Ranking dla krajów posiadających najniższe średnie stężenia ukazuje kraje, które pochodzą głównie z Europy oraz rejonu Ameryk. Bardzo niskie średnie wartości dla wszystkich z mierzonych cząstek są w Islandi, Estoni oraz Finlandii.
Ilość obserwacji dla krajów z najwyższymi stężeniami zanieczyszczeń¶
top_5_countries_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nlargest(5).index
top_5_countries_pm10 = country_stats['PM10 (μg/m3)']['mean'].nlargest(5).index
top_5_countries_no2 = country_stats['NO2 (μg/m3)']['mean'].nlargest(5).index
top_5_data_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_countries_pm25)]
top_5_data_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_countries_pm10)]
top_5_data_no2 = who_data[who_data['WHO Country Name'].isin(top_5_countries_no2)]
observations_pm25 = top_5_data_pm25.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
observations_pm10 = top_5_data_pm10.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
observations_no2 = top_5_data_no2.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
plt.figure(figsize=[15, 10])
plt.subplot(3, 1, 1)
observations_pm25.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM2.5 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.subplot(3, 1, 2)
observations_pm10.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM10 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.subplot(3, 1, 3)
observations_no2.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji NO2 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.tight_layout()
Kraje, posiadające najwyższe średnie wartości zanieczyszczeń są bardzo rzadko badane. Obserwacja ta wydaje się być nielogiczna - posiadając wysokie wartości stężeń tych cząstek powinno się je często badać oraz podejmować kroki w celu ich redukcji. Niestety kraje są często średnio rozwinięte i niezamożne, które nie są odpowiednio wyedukowane o skutkach niewłściwej polityki klimatyczne.
Ilość obserwacji dla krajów z najniższymi stężeniami zanieczyszczeń¶
less_5_countries_pm25 = country_stats['PM2.5 (μg/m3)']['mean'].nsmallest(5).index
less_5_countries_pm10 = country_stats['PM10 (μg/m3)']['mean'].nsmallest(5).index
less_5_countries_no2 = country_stats['NO2 (μg/m3)']['mean'].nsmallest(5).index
less_5_data_pm25 = who_data[who_data['WHO Country Name'].isin(less_5_countries_pm25)]
less_5_data_pm10 = who_data[who_data['WHO Country Name'].isin(less_5_countries_pm10)]
less_5_data_no2 = who_data[who_data['WHO Country Name'].isin(less_5_countries_no2)]
less_observations_pm25 = less_5_data_pm25.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
less_observations_pm10 = less_5_data_pm10.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
less_observations_no2 = less_5_data_no2.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
plt.figure(figsize=[15, 10])
plt.subplot(3, 1, 1)
less_observations_pm25.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM2.5 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.subplot(3, 1, 2)
less_observations_pm10.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji PM10 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.subplot(3, 1, 3)
less_observations_no2.plot(ax=plt.gca(), marker='o')
plt.title('Liczba obserwacji NO2 dla 5 najbardziej zanieczyszczonych krajów w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.tight_layout()
Kraje posiadające najniższe stężenia posiadają wiekszą liczbę obserwacji niż te posiadające najwyższe stężenia. Mimo to, liczba ta dalej nie jest wysoka.
Liczba obserwacji w każdym z regionów¶
#poszukac dalej jak usunac te wartosci wyswietlane przez jupytera bo szpącą
plt.figure(figsize = [20, 6])
country_counts = who_data['WHO Country Name'].value_counts()
sns.barplot(x = country_counts.index, y = country_counts.values)
plt.title('Liczba obserwacji dla poszczególnych regionów')
plt.xlabel('WHO Country Name')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117], [Text(0, 0, 'China'), Text(1, 0, 'Italy'), Text(2, 0, 'Germany'), Text(3, 0, 'Spain'), Text(4, 0, 'India'), Text(5, 0, 'France'), Text(6, 0, 'United States of America'), Text(7, 0, 'Poland'), Text(8, 0, 'Switzerland'), Text(9, 0, 'Canada'), Text(10, 0, 'Austria'), Text(11, 0, 'United Kingdom'), Text(12, 0, 'Czechia'), Text(13, 0, 'Turkey'), Text(14, 0, 'Romania'), Text(15, 0, 'Belgium'), Text(16, 0, 'Brazil'), Text(17, 0, 'Netherlands'), Text(18, 0, 'Sweden'), Text(19, 0, 'Portugal'), Text(20, 0, 'Finland'), Text(21, 0, 'Australia'), Text(22, 0, 'Bulgaria'), Text(23, 0, 'Chile'), Text(24, 0, 'Mexico'), Text(25, 0, 'Iran (Islamic Republic of)'), Text(26, 0, 'Norway'), Text(27, 0, 'Republic of Korea'), Text(28, 0, 'Slovakia'), Text(29, 0, 'New Zealand'), Text(30, 0, 'Hungary'), Text(31, 0, 'South Africa'), Text(32, 0, 'Greece'), Text(33, 0, 'Israel'), Text(34, 0, 'Slovenia'), Text(35, 0, 'Thailand'), Text(36, 0, 'Ireland'), Text(37, 0, 'Croatia'), Text(38, 0, 'Philippines'), Text(39, 0, 'Lithuania'), Text(40, 0, 'Colombia'), Text(41, 0, 'Peru'), Text(42, 0, 'Serbia'), Text(43, 0, 'Japan'), Text(44, 0, 'Kuwait'), Text(45, 0, 'Denmark'), Text(46, 0, 'Bangladesh'), Text(47, 0, 'Estonia'), Text(48, 0, 'Luxembourg'), Text(49, 0, 'North Macedonia'), Text(50, 0, 'Bosnia and Herzegovina'), Text(51, 0, 'Iceland'), Text(52, 0, 'Cyprus'), Text(53, 0, 'Latvia'), Text(54, 0, 'Bahrain'), Text(55, 0, 'Malta'), Text(56, 0, 'United Arab Emirates'), Text(57, 0, 'Viet Nam'), Text(58, 0, 'Montenegro'), Text(59, 0, 'Malaysia'), Text(60, 0, 'Ecuador'), Text(61, 0, 'Morocco'), Text(62, 0, 'Nepal'), Text(63, 0, 'Bhutan'), Text(64, 0, 'Myanmar'), Text(65, 0, 'Jordan'), Text(66, 0, 'Costa Rica'), Text(67, 0, 'Iraq'), Text(68, 0, 'Indonesia'), Text(69, 0, 'Albania'), Text(70, 0, 'Mongolia'), Text(71, 0, 'Pakistan'), Text(72, 0, 'Mauritius'), Text(73, 0, 'Singapore'), Text(74, 0, 'Jamaica'), Text(75, 0, 'Senegal'), Text(76, 0, 'El Salvador'), Text(77, 0, 'Qatar'), Text(78, 0, 'Trinidad and Tobago'), Text(79, 0, 'Andorra'), Text(80, 0, 'Lebanon'), Text(81, 0, 'Saudi Arabia'), Text(82, 0, 'Guatemala'), Text(83, 0, 'Argentina'), Text(84, 0, 'Egypt'), Text(85, 0, 'Ghana'), Text(86, 0, 'Sri Lanka'), Text(87, 0, 'Monaco'), Text(88, 0, 'Ethiopia'), Text(89, 0, 'Honduras'), Text(90, 0, 'Georgia'), Text(91, 0, 'Madagascar'), Text(92, 0, 'Tunisia'), Text(93, 0, 'Uganda'), Text(94, 0, 'Cameroon'), Text(95, 0, 'Venezuela (Bolivarian Republic of)'), Text(96, 0, 'Bahamas'), Text(97, 0, 'Russian Federation'), Text(98, 0, 'Kazakhstan'), Text(99, 0, 'Ukraine'), Text(100, 0, 'Kenya'), Text(101, 0, 'Uzbekistan'), Text(102, 0, 'Bolivia (Plurinational State of)'), Text(103, 0, 'Fiji'), Text(104, 0, 'Uruguay'), Text(105, 0, 'United Republic of Tanzania'), Text(106, 0, 'Paraguay'), Text(107, 0, 'Turkmenistan'), Text(108, 0, 'Tajikistan'), Text(109, 0, 'Algeria'), Text(110, 0, 'Liechtenstein'), Text(111, 0, 'Cuba'), Text(112, 0, 'Panama'), Text(113, 0, 'Nigeria'), Text(114, 0, 'Kyrgyzstan'), Text(115, 0, 'Maldives'), Text(116, 0, "Lao People's Democratic Republic"), Text(117, 0, 'Afghanistan')])
Krajem najczęściej badanym są Chiny, a następnie kraje Europejskie - Włochy, Niemcy, Hiszpania. Czołową piątke zamykają Indie.
Bazując na liczbie obswerwacji zdecydowano do dalszej analizy wybrać kraje, w których liczba obserwacji jest większa niż 100.
Zmiana ilości obserwacji w latach 5 najczęściej występujących krajów¶
top_5_countries_most_measurements = who_data['WHO Country Name'].value_counts().nlargest(5).index
top_5_data_most_measurements = who_data[who_data['WHO Country Name'].isin(top_5_countries_most_measurements)]
observations_most_measurements = top_5_data_most_measurements.groupby(['Measurement Year', 'WHO Country Name']).size().unstack()
plt.figure(figsize=[10, 6])
observations_most_measurements.plot(marker='o')
plt.title('Liczba obserwacji dla 5 krajów, które najczęściej przeprowadzały pomiary, w poszczególnych latach')
plt.xlabel('Rok')
plt.ylabel('Liczba obserwacji')
plt.legend(title='Kraj', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.grid()
plt.tight_layout()
<Figure size 1000x600 with 0 Axes>
Dlakrajów z najczęstrzymi pomiarami od 2014 roku liczba pomiarów z roku na rok delikatnie rośnie. Wyjątkiem jest lider - Chiny, który w roku 2017 zanotował ogromny ponad 300% wzrost ilości obserwacji i delikatny spadek po roku 2018. Wzrost z 2017 roku wysunał ich na pierwsze miejsce w rankingu z ogromną przewagą (około 1000 pomiarów rocznych do +/- 400).
country_obs_counts = who_data.groupby(['WHO Country Name', 'Measurement Year']).size().unstack().sum(axis=1)
countries_over_100_obs = country_obs_counts[country_obs_counts > 100].index
#print("Kraje, dla których liczba obserwacji jest większa niż 100:")
#print(countries_over_100_obs)
top_5_pm25_largest = country_stats.loc[countries_over_100_obs, ('PM2.5 (μg/m3)', 'mean')].nlargest(5)
top_5_pm10_largest = country_stats.loc[countries_over_100_obs, ('PM10 (μg/m3)', 'mean')].nlargest(5)
top_5_no2_largest = country_stats.loc[countries_over_100_obs, ('NO2 (μg/m3)', 'mean')].nlargest(5)
print("Top 5 kraje o najwyższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm25_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najwyższych średnich stężeniach PM10 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm10_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najwyższych średnich stężeniach NO2 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_no2_largest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
China 43.072988 41.49 16.356075
India 40.444798 36.00 20.200245
Iran (Islamic Republic of) 31.508929 29.25 14.604950
Philippines 29.710526 29.00 11.361166
Chile 24.977411 25.41 9.976247
Top 5 kraje o najwyższych średnich stężeniach PM10 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
Iran (Islamic Republic of) 31.508929 29.25 14.604950
India 40.444798 36.00 20.200245
China 43.072988 41.49 16.356075
Chile 24.977411 25.41 9.976247
Turkey 22.831111 21.42 7.730100
Top 5 kraje o najwyższych średnich stężeniach NO2 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
Iran (Islamic Republic of) 31.508929 29.250 14.604950
Republic of Korea 23.274510 23.000 3.582567
China 43.072988 41.490 16.356075
Mexico 23.026333 23.315 5.014018
Turkey 22.831111 21.420 7.730100
Rankingi krajów gdzie liczba obserwacji jest większa od 100 ukazują, że najbardziej zanieczyszczone mierzonymi cząstkami są Chiny (kraj tworzący pomiary najczęściej), Indie oraz Iran.
top_5_pm25_smallest = country_stats.loc[countries_over_100_obs, ('PM2.5 (μg/m3)', 'mean')].nsmallest(5)
top_5_pm10_smallest = country_stats.loc[countries_over_100_obs, ('PM10 (μg/m3)', 'mean')].nsmallest(5)
top_5_no2_smallest = country_stats.loc[countries_over_100_obs, ('NO2 (μg/m3)', 'mean')].nsmallest(5)
print("Top 5 kraje o najniższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm25_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najniższych średnich stężeniach PM10 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_pm10_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("Top 5 kraje o najniższych średnich stężeniach NO2 (powyzej 100 obserwacji):")
print(country_stats.loc[top_5_no2_smallest.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
Top 5 kraje o najniższych średnich stężeniach PM2.5 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
Sweden 6.165315 5.900 2.220703
Finland 6.200472 6.135 1.577751
Canada 6.627647 6.025 2.205813
Norway 6.913800 7.135 2.380776
Portugal 7.937835 7.490 3.335800
Top 5 kraje o najniższych średnich stężeniach PM10 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
Finland 6.200472 6.135 1.577751
Canada 6.627647 6.025 2.205813
Ireland 8.536531 8.350 2.207306
Norway 6.913800 7.135 2.380776
Switzerland 10.516102 10.100 2.889568
Top 5 kraje o najniższych średnich stężeniach NO2 (powyzej 100 obserwacji):
PM2.5 (μg/m3)
mean median std
WHO Country Name
Australia 8.417000 7.600 5.577581
Canada 6.627647 6.025 2.205813
New Zealand 9.459773 9.790 3.164996
Finland 6.200472 6.135 1.577751
Ireland 8.536531 8.350 2.207306
Najniższe wartości zanieczyszczeń posiadają kraje Skandynawskie oraz Australia i Canada.
selected_countries_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_pm25_largest.index)]
selected_countries_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_pm10_largest.index)]
selected_countries_no2 = who_data[who_data['WHO Country Name'].isin(top_5_no2_largest.index)]
fig, axes = plt.subplots(3, 1, figsize=(12, 18))
sns.lineplot(data=selected_countries_pm25, x='Measurement Year', y='PM2.5 (μg/m3)', hue='WHO Country Name', ax=axes[0])
axes[0].set_title('Zmiany stężenia PM2.5 w wybranych krajach')
axes[0].set_xlabel('Rok pomiaru')
axes[0].set_ylabel('Stężenie PM2.5 (μg/m3)')
axes[0].set_xlim(selected_countries_pm25['Measurement Year'].min(), selected_countries_pm25['Measurement Year'].max())
axes[0].legend(title='Kraj')
axes[0].grid()
sns.lineplot(data=selected_countries_pm10, x='Measurement Year', y='PM10 (μg/m3)', hue='WHO Country Name', ax=axes[1])
axes[1].set_title('Zmiany stężenia PM10 w wybranych krajach')
axes[1].set_xlabel('Rok pomiaru')
axes[1].set_ylabel('Stężenie PM10 (μg/m3)')
axes[1].set_xlim(selected_countries_pm10['Measurement Year'].min(), selected_countries_pm10['Measurement Year'].max())
axes[1].legend(title='Kraj')
axes[1].grid()
sns.lineplot(data=selected_countries_no2, x='Measurement Year', y='NO2 (μg/m3)', hue='WHO Country Name', ax=axes[2])
axes[2].set_title('Zmiany stężenia NO2 w wybranych krajach')
axes[2].set_xlabel('Rok pomiaru')
axes[2].set_ylabel('Stężenie NO2 (μg/m3)')
axes[2].set_xlim(selected_countries_no2['Measurement Year'].min(), selected_countries_no2['Measurement Year'].max())
axes[2].legend(title='Kraj')
axes[2].grid()
plt.tight_layout()
Widoczne jest wyrażne wypłaszczenie zmian wartości mierzonych stężeń po roku 2016.
selected_countries_pm25 = who_data[who_data['WHO Country Name'].isin(top_5_pm25_smallest.index)]
selected_countries_pm10 = who_data[who_data['WHO Country Name'].isin(top_5_pm10_smallest.index)]
selected_countries_no2 = who_data[who_data['WHO Country Name'].isin(top_5_no2_smallest.index)]
fig, axes = plt.subplots(3, 1, figsize=(12, 18))
sns.lineplot(data=selected_countries_pm25, x='Measurement Year', y='PM2.5 (μg/m3)', hue='WHO Country Name', ax=axes[0])
axes[0].set_title('Zmiany stężenia PM2.5 w wybranych krajach')
axes[0].set_xlabel('Rok pomiaru')
axes[0].set_ylabel('Stężenie PM2.5 (μg/m3)')
axes[0].set_xlim(selected_countries_pm25['Measurement Year'].min(), selected_countries_pm25['Measurement Year'].max())
axes[0].legend(title='Kraj')
axes[0].grid()
sns.lineplot(data=selected_countries_pm10, x='Measurement Year', y='PM10 (μg/m3)', hue='WHO Country Name', ax=axes[1])
axes[1].set_title('Zmiany stężenia PM10 w wybranych krajach')
axes[1].set_xlabel('Rok pomiaru')
axes[1].set_ylabel('Stężenie PM10 (μg/m3)')
axes[1].set_xlim(selected_countries_pm10['Measurement Year'].min(), selected_countries_pm10['Measurement Year'].max())
axes[1].legend(title='Kraj')
axes[1].grid()
sns.lineplot(data=selected_countries_no2, x='Measurement Year', y='NO2 (μg/m3)', hue='WHO Country Name', ax=axes[2])
axes[2].set_title('Zmiany stężenia NO2 w wybranych krajach')
axes[2].set_xlabel('Rok pomiaru')
axes[2].set_ylabel('Stężenie NO2 (μg/m3)')
axes[2].set_xlim(selected_countries_no2['Measurement Year'].min(), selected_countries_no2['Measurement Year'].max())
axes[2].legend(title='Kraj')
axes[2].grid()
plt.tight_layout()
c) Miasta¶
10 najczęściej badanych miast¶
plt.figure(figsize = [20, 6])
cities_counts = who_data['City or Locality'].value_counts()[:100]
sns.barplot(x = cities_counts.index, y = cities_counts.values)
plt.title('Liczba obserwacji dla poszczególnych miast')
plt.xlabel('WHO Country Name')
plt.ylabel('Liczba obserwacji')
plt.xticks(rotation = 90)
([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99], [Text(0, 0, 'Saxon'), Text(1, 0, 'Avully'), Text(2, 0, 'Basel'), Text(3, 0, 'Meyrin'), Text(4, 0, 'Bern'), Text(5, 0, 'Lugano'), Text(6, 0, 'Lausanne'), Text(7, 0, 'Payerne'), Text(8, 0, 'Ebikon'), Text(9, 0, 'Opfikon'), Text(10, 0, 'Salamanca'), Text(11, 0, 'Bratislava'), Text(12, 0, 'Ittigen'), Text(13, 0, 'Winterthur'), Text(14, 0, 'Cuenca'), Text(15, 0, 'London'), Text(16, 0, 'Luzern'), Text(17, 0, 'Ethekwini'), Text(18, 0, 'Southampton'), Text(19, 0, 'Montana'), Text(20, 0, 'Seoul'), Text(21, 0, 'Lima'), Text(22, 0, 'Gyeonggi-Do'), Text(23, 0, 'San Fernando'), Text(24, 0, 'Gert Sibande'), Text(25, 0, 'Jeju-Do'), Text(26, 0, 'Incheon'), Text(27, 0, 'Nkangala'), Text(28, 0, 'Ulsan'), Text(29, 0, 'Gwangju'), Text(30, 0, 'Daejeon'), Text(31, 0, 'Laval'), Text(32, 0, 'Daegu'), Text(33, 0, 'Busan'), Text(34, 0, 'Gangwon-Do'), Text(35, 0, 'Sedibeng'), Text(36, 0, 'Bathurst'), Text(37, 0, 'Barcelona'), Text(38, 0, 'Tehran'), Text(39, 0, 'Rigi'), Text(40, 0, 'Singapore'), Text(41, 0, 'Chaumont'), Text(42, 0, 'Gyeongsangnam-Do'), Text(43, 0, 'Gyeongsangbuk-Do'), Text(44, 0, 'Chungcheongbuk-Do'), Text(45, 0, 'Waterberg'), Text(46, 0, 'Magadino'), Text(47, 0, 'Chungcheongnam-Do'), Text(48, 0, 'Jeollabuk-Do'), Text(49, 0, 'Jeollanam-Do'), Text(50, 0, 'Ha Noi'), Text(51, 0, 'Manama'), Text(52, 0, 'San Francisco-Oakland-Hayward (Ca)'), Text(53, 0, 'Madera (Ca)'), Text(54, 0, 'Bakersfield (Ca)'), Text(55, 0, 'Fairbanks (Ak)'), Text(56, 0, 'Dhaka'), Text(57, 0, 'Santa Maria-Santa Barbara (Ca)'), Text(58, 0, 'Locarno'), Text(59, 0, 'Les Giettes'), Text(60, 0, 'Massongex'), Text(61, 0, 'Le Locle'), Text(62, 0, 'Le Landeron'), Text(63, 0, 'Vallejo-Fairfield (Ca)'), Text(64, 0, 'Chittagong'), Text(65, 0, 'San Luis Obispo-Paso Robles-Arroyo Grande (Ca)'), Text(66, 0, 'Atlanta-Sandy Springs-Roswell (Ga)'), Text(67, 0, 'Omaha-Council Bluffs (Ne-Ia)'), Text(68, 0, 'Giubiasco'), Text(69, 0, 'Albuquerque (Nm)'), Text(70, 0, 'Härkingen'), Text(71, 0, 'San Jose-Sunnyvale-Santa Clara (Ca)'), Text(72, 0, 'Washington-Arlington-Alexandria (Dc-Va-Md-Wv)'), Text(73, 0, 'Allentown-Bethlehem-Easton (Pa-Nj)'), Text(74, 0, 'Santa Rosa (Ca)'), Text(75, 0, 'Jungfraujoch'), Text(76, 0, 'Eureka-Arcata-Fortuna (Ca)'), Text(77, 0, 'La Chaux'), Text(78, 0, 'El Paso (Tx)'), Text(79, 0, 'El Centro (Ca)'), Text(80, 0, 'Anchorage (Ak)'), Text(81, 0, 'Durango (Co)'), Text(82, 0, 'Visalia-Porterville (Ca)'), Text(83, 0, 'Langenthal'), Text(84, 0, 'Genève'), Text(85, 0, 'Mendrisio'), Text(86, 0, 'Davenport-Moline-Rock Island (Ia-Il)'), Text(87, 0, 'Urban Honolulu (Hi)'), Text(88, 0, 'Schwyz'), Text(89, 0, 'Boston-Cambridge-Newton (Ma-Nh)'), Text(90, 0, 'Sion'), Text(91, 0, 'Sissach'), Text(92, 0, 'Payson (Az)'), Text(93, 0, 'Solothurn'), Text(94, 0, 'St Gallen'), Text(95, 0, 'Tänikon'), Text(96, 0, 'Thônex'), Text(97, 0, 'Thun'), Text(98, 0, 'Dakar'), Text(99, 0, 'Pittsburgh (Pa)')])
#!pip install folium
#!pip install geopy
import folium
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city, count in cities_counts.items():
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Luis+Obispo-Paso+Robles-Arroyo+Grande+%28Ca%29&format=json&limit=1
10 miast posiadających największą średnią wartość stężeń¶
cities_stats = who_data.groupby('City or Locality').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
'PM10 (μg/m3)': ['mean', 'median', 'std'],
'NO2 (μg/m3)': ['mean', 'median', 'std']})
top_10_pm25 = cities_stats.loc[cities_counts.index, 'PM2.5 (μg/m3)']['mean'].nlargest(10)
top_10_pm10 = cities_stats.loc[cities_counts.index, 'PM10 (μg/m3)']['mean'].nlargest(10)
top_10_no2 = cities_stats.loc[cities_counts.index, 'NO2 (μg/m3)']['mean'].nlargest(10)
print("Top 5 kraje o najwyższych średnich stężeniach PM2.5:")
print(cities_stats.loc[top_10_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najwyższych średnich stężeniach PM10:")
print(cities_stats.loc[top_10_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])
print("\nTop 5 kraje o najwyższych średnich stężeniach NO2:")
print(cities_stats.loc[top_10_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 5 kraje o najwyższych średnich stężeniach PM2.5:
PM2.5 (μg/m3)
mean median std
City or Locality
Dhaka 75.353000 73.235 16.798171
Chittagong 69.263000 65.825 14.226632
Manama 57.370000 60.750 7.550490
Ha Noi 52.593333 49.360 14.995133
Sedibeng 36.940000 32.970 9.680417
Tehran 31.610000 31.390 3.597527
Lima 30.682857 30.140 6.297523
Dakar 29.880000 29.710 7.497594
Jeollabuk-Do 27.666667 27.500 5.202563
Chungcheongbuk-Do 26.500000 27.000 3.016621
Top 5 kraje o najwyższych średnich stężeniach PM10:
PM10 (μg/m3)
mean median std
City or Locality
Dhaka 139.387500 141.065 25.387524
Dakar 135.517143 136.190 7.068325
Manama 131.356667 120.500 54.362944
Chittagong 122.174000 120.250 19.956229
Tehran 82.084286 83.670 7.149070
Lima 63.592727 61.190 12.914875
Sedibeng 63.320000 61.410 12.316069
Nkangala 56.855556 49.940 16.085480
Gyeonggi-Do 50.916667 53.000 5.484828
Chungcheongbuk-Do 49.000000 51.000 7.745967
Top 5 kraje o najwyższych średnich stężeniach NO2:
NO2 (μg/m3)
mean median std
City or Locality
Tehran 82.698000 84.970 13.997577
Seoul 57.990769 60.160 5.308915
Gyeonggi-Do 51.230000 53.580 5.561115
Dhaka 50.830000 42.010 16.226403
Incheon 49.350000 49.820 5.384993
Ulsan 41.203333 42.300 3.252141
Barcelona 40.463750 39.630 3.471451
Daegu 40.263333 39.480 4.773486
Luzern 40.103571 40.955 6.484402
Mendrisio 39.230000 40.300 7.220965
geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city in top_10_pm25.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'green')).add_to(world_map)
for city in top_10_pm10.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'blue')).add_to(world_map)
for city in top_10_no2.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)
legend_html = """
<div style="position: fixed;
bottom: 50px; left: 50px; width: 150px; height: 120px;
border:2px solid grey; z-index:9999; font-size:14px;
background-color:white;
">
<strong>Legenda</strong><br>
PM2.5 <i class="fa fa-map-marker fa-2x" style="color:green"></i><br>
PM10 <i class="fa fa-map-marker fa-2x" style="color:blue"></i><br>
NO2 <i class="fa fa-map-marker fa-2x" style="color:red"></i>
</div>
"""
world_map.get_root().html.add_child(folium.Element(legend_html))
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=Seoul&format=json&limit=1
10 miast posiadających najniższą średnią wartość stężeń¶
cities_stats = who_data.groupby('City or Locality').agg({'PM2.5 (μg/m3)': ['mean', 'median', 'std'],
'PM10 (μg/m3)': ['mean', 'median', 'std'],
'NO2 (μg/m3)': ['mean', 'median', 'std']})
less_10_pm25 = cities_stats.loc[cities_counts.index, 'PM2.5 (μg/m3)']['mean'].nsmallest(10)
less_10_pm10 = cities_stats.loc[cities_counts.index, 'PM10 (μg/m3)']['mean'].nsmallest(10)
less_10_no2 = cities_stats.loc[cities_counts.index, 'NO2 (μg/m3)']['mean'].nsmallest(10)
print("Top 10 kraje o najniższych średnich stężeniach PM2.5:")
print(cities_stats.loc[less_10_pm25.index, [('PM2.5 (μg/m3)', 'mean'), ('PM2.5 (μg/m3)', 'median'), ('PM2.5 (μg/m3)', 'std')]])
print("\nTop 10 kraje o najniższych średnich stężeniach PM10:")
print(cities_stats.loc[less_10_pm10.index, [('PM10 (μg/m3)', 'mean'), ('PM10 (μg/m3)', 'median'), ('PM10 (μg/m3)', 'std')]])
print("\nTop 10 kraje o najniższych średnich stężeniach NO2:")
print(cities_stats.loc[less_10_no2.index, [('NO2 (μg/m3)', 'mean'), ('NO2 (μg/m3)', 'median'), ('NO2 (μg/m3)', 'std')]])
Top 10 kraje o najniższych średnich stężeniach PM2.5:
PM2.5 (μg/m3)
mean median std
City or Locality
Urban Honolulu (Hi) 4.13000 3.685 1.490511
Montana 4.80000 4.800 0.424264
Anchorage (Ak) 5.34300 5.265 0.794915
Rigi 5.41000 5.150 0.872353
Boston-Cambridge-Newton (Ma-Nh) 5.45000 5.350 0.804674
Eureka-Arcata-Fortuna (Ca) 5.97500 5.850 0.434933
Le Locle 6.00000 6.000 NaN
San Jose-Sunnyvale-Santa Clara (Ca) 6.38125 5.400 2.631395
Santa Maria-Santa Barbara (Ca) 6.50000 7.000 1.513275
Albuquerque (Nm) 6.90000 6.900 NaN
Top 10 kraje o najniższych średnich stężeniach PM10:
PM10 (μg/m3)
mean median std
City or Locality
Jungfraujoch 2.390000 2.400 0.425441
Rigi 7.420909 7.400 0.784990
Chaumont 7.430909 7.500 0.922447
Les Giettes 7.620000 7.350 1.216370
Washington-Arlington-Alexandria (Dc-Va-Md-Wv) 10.341667 10.750 2.226750
Le Locle 11.775000 11.600 1.716100
Allentown-Bethlehem-Easton (Pa-Nj) 11.900000 11.500 0.871780
La Chaux 12.220000 12.150 1.376630
Santa Rosa (Ca) 12.250000 11.975 1.725946
Boston-Cambridge-Newton (Ma-Nh) 12.400000 12.950 2.516347
Top 10 kraje o najniższych średnich stężeniach NO2:
NO2 (μg/m3)
mean median std
City or Locality
Jungfraujoch 0.230000 0.200 0.048305
Bathurst 3.000000 3.000 1.154701
Les Giettes 3.880000 3.450 1.093211
San Luis Obispo-Paso Robles-Arroyo Grande (Ca) 4.488889 4.600 0.841790
Santa Maria-Santa Barbara (Ca) 4.592000 4.335 1.143890
Eureka-Arcata-Fortuna (Ca) 5.240000 5.050 0.732120
Chaumont 5.573636 5.600 0.802898
Rigi 6.176364 6.200 1.208199
Urban Honolulu (Hi) 6.183333 6.050 0.877306
Durango (Co) 6.864000 6.700 1.319446
geolocator = Nominatim(user_agent = 'my_geocoder')
world_map = folium.Map(location = [20, 0], zoom_start = 2)
for city in less_10_pm25.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'green')).add_to(world_map)
for city in less_10_pm10.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'blue')).add_to(world_map)
for city in less_10_no2.index:
location = geolocator.geocode(city)
if location:
lat, lon = location.latitude, location.longitude
folium.Marker([lat, lon], popup = city, icon = folium.Icon(color = 'red')).add_to(world_map)
legend_html = """
<div style="position: fixed;
bottom: 50px; left: 50px; width: 150px; height: 120px;
border:2px solid grey; z-index:9999; font-size:14px;
background-color:white;
">
<strong>Legenda</strong><br>
PM2.5 <i class="fa fa-map-marker fa-2x" style="color:green"></i><br>
PM10 <i class="fa fa-map-marker fa-2x" style="color:blue"></i><br>
NO2 <i class="fa fa-map-marker fa-2x" style="color:red"></i>
</div>
"""
world_map.get_root().html.add_child(folium.Element(legend_html))
world_map
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Jose-Sunnyvale-Santa+Clara+%28Ca%29&format=json&limit=1
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='nominatim.openstreetmap.org', port=443): Read timed out. (read timeout=1)")': /search?q=San+Luis+Obispo-Paso+Robles-Arroyo+Grande+%28Ca%29&format=json&limit=1
4. Mapa¶
#!pip install geopandas
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
merged_data = world.merge(who_data, how='left', left_on='iso_a3', right_on='ISO3')
merged_data[['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']] = merged_data[['PM2.5 (μg/m3)', 'PM10 (μg/m3)', 'NO2 (μg/m3)']].fillna(0)
fig, axes = plt.subplots(3, 1, figsize = [15, 15])
merged_data.plot(column='PM2.5 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[0], edgecolor = '0.8', legend = True)
axes[0].set_title('PM2.5')
merged_data.plot(column='PM10 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[1], edgecolor = '0.8', legend = True)
axes[1].set_title('PM10')
merged_data.plot(column='NO2 (μg/m3)', cmap = 'OrRd', linewidth = 0.8, ax = axes[2], edgecolor = '0.8', legend = True)
axes[2].set_title('NO2')
fig.suptitle("Rozkłady stężęń zanieczyszczeń na mapie świata")
Text(0.5, 0.98, 'Rozkłady stężęń zanieczyszczeń na mapie świata')
5. Wnioski na temat wpływu zanieczyszczenia powietrza na dane regiony, kraje i miasta.¶
Po wykonanej analizie, nasuwające się wnioski to:
- Kraje dobrze rozwinięte (głównie kraje Europejskie, ale również część Azji oraz Ameryka) badają stężenia zanieczyszczeń znacznie częściej niż kraje słabo rozwinięte (między innymi Afryka).
- W krajach częsciej badających stężenia zanieczyszczeń widoczne jest ustabliziowanie lub spadek wielkości stężęń badanych cząstek.
- Kraje wysoko rozwinięte posiadają niższe stężęń zanieczyszeń niz kraje słabo rozwinięte.
- Na badanym okresie widoczny jest wzrost ilości badanych próbek z roku na rok.
6. Potencjalne zastosowania wykorzystanych danych w uczeniu maszynowym¶
Po wykonaniu EDA na różnych poziomach generalizacji:
- Zbiór wydaje się być dobrym do próby stworzenia na nim modelu uczenia maszynowego przewidującego stężenia zanieczyszczeń w danej stacji w przyszłości.
- Dodatkowo istnieje możliwość implementacji modelu, który bazując na danych wartościach zanieczyszczeń spróbuje przewidzieć z jakiego rejonu, kraju lub stacji pochodziły dane.
- Ciekawa wydaje się być również próba estymacji zmiany liczby pomieranych próbek przez kraj w zależności od zmiany stężeń zanieczyszczeń.